﻿#ifndef CPPAPI_H
#define CPPAPI_H
#include <vector>
#include <string>
#include <XLDocument.hpp>

#include "exprvalue.h"

#include "PinParser.h"
#include "global.h"

struct CPP_FUN_INFO_;

// 定义回调函数的类型
typedef int (*CallbackFun)(CPP_FUN_INFO_* fun_info, PinParser::RealCallFunContext* ctx);

QStringList getParaFromCmdStr(QByteArray& srcText, PinParser::RealCallFunContext* ctx);

typedef struct CPP_FUN_INFO_
{
    unsigned short fun_id;
    unsigned short owner_pack_id; //方法归属的对象类型。比如时间、字符串等。如果是自定义的结构体，则使用结构体的id。
    short fun_type; //函数类型。是否是全局包函数，比如wj::,默认是0，表示是类成员函数。如果是全局则是1，其它还可以是扩展。
    short reserve;//对目前做对齐，暂时不使用，保留。
    //int ret_type;// 返回值类型。目前没使用
    //int need_var_name; //是否需要变量名称，默认不需要。个别方法需要。
    std::vector<int> * paraList; //参数类型。没有则无参数
    CallbackFun call_back_fun;

    CPP_FUN_INFO_()
    {
        paraList = nullptr;
        fun_type = 0;
    }
    CPP_FUN_INFO_(int id, std::vector<int> *pRara)
    {
        fun_id = id;
        paraList = pRara;
        fun_type = 0;
    }
    void destory()
    {
        if (paraList != nullptr)
        {
            delete paraList;
#ifdef PIN_MEM_REF
            freeTimes++;
#endif
            paraList = nullptr;
        }
    }

}CPP_FUN_INFO;

void resetGlboalVar();
void initCppFunTab();
void destoryCppFunTab();

//void destoryFileFunTab();

void callFun(CPP_FUN_INFO* s_cppFunTab,PinParser::RealCallFunContext* ctx);

CPP_FUN_INFO* findCppFun(ExprValue& objExpr, std::string& funNam, PinParser::RealCallFunContext* ctx = nullptr);

void checkCallFunPara(PinParser::RealCallFunContext* ctx, std::string& funName, CPP_FUN_INFO& funInfo);

QByteArray getQtCodecNameById(int id);

void initPinFunTab();

#endif // FILEAPI_H
